﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.IO;
using Newtonsoft;
using Newtonsoft.Json;
using Newtonsoft.Json.Bson;
using Newtonsoft.Json.Converters;
using Newtonsoft.Json.Linq;

namespace MetaSearcher
{
    class iknowtravelcookie
    {
        public string cookie { get; set; }

    }
    class Program
    {
        [JsonObject]
        public struct JsonUserObejct1
        {
            [JsonProperty]
            public Query query
            {
                get;
                set;
            }

            [JsonProperty]
            public Results results
            {
                get;
                set;
            }
        }


        [JsonObject(MemberSerialization.OptIn)]
        public struct Query
        {
            [JsonProperty]
            public Flights[] flights
            {
                get;
                set;
            }

            [JsonProperty]
            public string classtype
            {
                get;
                set;
            }
        }

        [JsonObject(MemberSerialization.OptIn)]
        public struct Flights
        {
            [JsonProperty]
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime date
            {
                get;
                set;
            }

            [JsonProperty]
            public string departure
            {
                get;
                set;
            }

            [JsonProperty]
            public string arrival
            {
                get;
                set;
            }
        }

        [JsonObject(MemberSerialization.OptIn)]
        public struct Results
        {
            [JsonProperty]
            public Offers[] offers
            {
                get;
                set;
            }

            [JsonProperty]
            public Segments[] segments
            {
                get;
                set;
            }
        }

        [JsonObject(MemberSerialization.OptIn)]
        public struct Segments
        {
            [JsonProperty]
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime departure_date
            {
                get;
                set;
            }

            [JsonProperty]
            [JsonConverter(typeof(IsoDateTimeConverter))]
            public DateTime arrival_date
            {
                get;
                set;
            }

            [JsonProperty]
            public string flight_code
            {
                get;
                set;
            }

            [JsonProperty]
            public string service_class
            {
                get;
                set;
            }
        }
        [JsonObject(MemberSerialization.OptIn)]
        public struct Offers
        {
            [JsonProperty]
            public int price
            {
                get;
                set;
            }

            [JsonProperty]
            public string airline
            {
                get;
                set;
            }

            [JsonProperty]
            public string airline_code
            {
                get;
                set;
            }

            [JsonProperty]
            public int stoptime
            {
                get;
                set;
            }

            [JsonProperty]
            public string operator_codes
            {
                get;
                set;
            }

        }

        // Цена:   jUserObject.results.offers[i].price
        // Номер рейса: jUserObject.results.offers[i].operator_codes
        // Авиакомпания: jUserObject.results.offers[i].airline


        public void IKnowParse(string jsonObj, DBManipulation dbtest, string Connection)
        {

            try
            {
                JsonUserObejct1 jUserObject = JsonConvert.DeserializeObject<JsonUserObejct1>(jsonObj);
                // город отправления
                string gorodIz = jUserObject.query.flights[0].departure;
                // город прибытия
                string gorodKyda = jUserObject.query.flights[0].arrival;
                for (int i = 0; i < jUserObject.results.offers.Length; i++)
                {
                    if (jUserObject.results.offers[i].stoptime == 0)
                        for (int j = 0; j < jUserObject.results.segments.Length; j++)
                        {
                            if (jUserObject.results.offers[i].operator_codes == jUserObject.results.segments[j].flight_code)
                            {
                                // цена
                                int Price = jUserObject.results.offers[i].price;
                                //Console.WriteLine((jUserObject.results.offers[i].price));
                                // рейс
                                string aircode = jUserObject.results.offers[i].operator_codes;
                                // авиакомпания
                                string airline_code = jUserObject.results.offers[i].airline_code;
                                // класс
                                string fclass = jUserObject.results.segments[j].service_class;
                                // время отправления
                                DateTime departure = jUserObject.results.segments[j].departure_date;
                                // время прибытия
                                //DateTime arrival = jUserObject.results.segments[j].arrival_date;
                                // текущее время
                                DateTime current = DateTime.Today;
                                //Console.WriteLine((jUserObject.results.offers[i].operator_codes));


                                dbtest.insertIntoMain(Connection, "iknow.travel", gorodIz, gorodKyda, departure, departure, Price, airline_code, fclass, current);
                            }
                        }

                }
            }
            catch (Exception ee) { Console.WriteLine("                 -----> NO TICKETS FOUND FOR REQUESTED DAY.");}
            //tut
        }


        public string getDataFromIknowTravel(string dateFl, string cityFrom, string cityTo, string travelType)
        {
            System.Net.HttpWebRequest reqGET = (HttpWebRequest)HttpWebRequest.Create(@"http://iknow.travel/api/checkinvite?code=ik83wt2a2el"); //Устанавливаем URL запроса
            System.Net.CookieContainer cookies = new System.Net.CookieContainer(); // Создаем переменную для куков
            reqGET.CookieContainer = cookies;
            System.Net.WebResponse resp = reqGET.GetResponse(); // Получаем ответ
            cookies = reqGET.CookieContainer; // Запоминаем куки
            System.IO.Stream stream = resp.GetResponseStream(); // Ловим поток символов ответа на запрос
            System.IO.StreamReader sr = new System.IO.StreamReader(stream);
            string responseCookie = sr.ReadToEnd(); // Запоминаем его в строку
            // Парсим полученную строку-ответ и добавляем нужные данные в переменную cookies для дальнейшей передачи с запросом
            cookies.Add(new Cookie(new Newtonsoft.Json.JsonSerializer().Deserialize<iknowtravelcookie>(new Newtonsoft.Json.JsonTextReader(new StringReader(responseCookie))).cookie, "", "/", "iknow.travel"));
            // Формируем строку для post-запроса
            string queryString = "{'flights':[{'date':'" + dateFl + "','departure':'" + cityFrom + "','arrival':'" + cityTo + "'}],'traveltype':'oneway','passengers':[{'passengerstype':'adult','count':'1'}],'classtype':'economy'}";
            System.Net.HttpWebRequest reqPOST = (HttpWebRequest)HttpWebRequest.Create(@"http://iknow.travel/api/search/regular"); //Устанавливаем URL запроса
            reqPOST.Method = "POST"; // Устанавливаем метод передачи данных в POST
            reqPOST.ContentType = "application/json, text/javascript"; // Указываем тип контента
            reqPOST.CookieContainer = cookies; // Присваиваем куки
            byte[] sentData = Encoding.GetEncoding(1251).GetBytes(queryString);
            reqPOST.ContentLength = sentData.Length;
            System.IO.Stream sendStream = reqPOST.GetRequestStream(); // Также посылаем json-строку потоком в запрос
            sendStream.Write(sentData, 0, sentData.Length);
            sendStream.Close();
            System.Net.WebResponse result = reqPOST.GetResponse(); // Получаем ответ
            System.IO.Stream stream1 = result.GetResponseStream(); // Берем поток символов от полученного результата
            System.IO.StreamReader sr1 = new System.IO.StreamReader(stream1);
            string resultString = sr1.ReadToEnd(); // Запоминаем в строку
            Console.WriteLine("                 Sending to parser: " + cityFrom + " to " + cityTo + " for " + dateFl + "...");
            
            return resultString;
        }

        /*
        static void Main(string[] args)
        {
            String Connection = "Database=meta;Data Source=188.35.9.179;User Id=galogen13;Password=13101991;";
            getPage.DBManipulation dbtest = new getPage.DBManipulation();
            getPage.QueryPattern[] que = dbtest.selectFromQuery(Connection, ""); //тут писать условия поиска
            Program getData = new Program();
            for (int i = 1; i <= que.Length-1; i++)
            {
                Console.WriteLine("Запрашиваю перелета из " + que[i].city_from + " в " + que[i].city_to + " на " + que[i].date_browse + ". Жду ответ...");
                //Console.WriteLine(que[i].toString());
                DateTime date = que[i].date_browse;
                String dateFl = date.Year + "-" + date.Month + "-" + date.Day + "T00:00:00.000Z";
                string result = getData.getDataFromIknowTravel(dateFl, que[i].city_from.ToString(), que[i].city_to.ToString(), "economy");
                getData.IKnowParse(result, dbtest, Connection);
                Console.WriteLine("Парсинг " + i + " завершен.");
            }
            Console.ReadLine();
        }
        */
    }
}
